/**
 * Copyright (c) 2017, Alex. All rights reserved.
 */
package com.oschina.bottle.common.model;

import com.oschina.bottle.common.dto.BaseDTO;

import java.util.Map;

/**
 * 分页查询对象
 * 如果参数错误，会抛出IllegalArgumentException异常
 *
 * 索引方式查询
 * ++++ 必须参数page(>0)、pageSize(>0)
 * ++++ sql中的写法为 limit #{offset}, #{limit}
 *
 * 游标方式查询
 * ++++ 除了第一页查询不需要cursor参数，其他cursor必须
 * ++++ sql中的用法为 cursor (>、<) #{cursor} limit #{limit}
 *
 * params 会自定查询条件，根据场景填写
 *
 * @author <a href="mailto:zhongchao@gegejia.com">zhong</a>
 * @version 1.0 2017/9/27
 * @since 1.0
 */
public class PageQuery extends BaseDTO
{

    /**
     * 当前页码
     */
    private int page;

    /**
     * 每页数据大小
     */
    private int pageSize;

    /**
     * 游标
     */
    private Object cursor;

    /**
     * 扩展查询参数
     */
    private Map<String, Object> params;

    /**
     * 索引方式查询数据
     * 根据传入 当前页码、每页数据大小等查询索引当前页面数据
     *
     * @param page          当前页码
     * @param pageSize      当前页数据条数
     * @param params        查询参数
     * @return
     */
    public static PageQuery buildByIndex(int page, int pageSize, Map<String, Object> params) {
        if(page <= 0) {
            throw new IllegalArgumentException("the page must greater than 0");
        }

        if(pageSize <= 0) {
            throw new IllegalArgumentException("the pageSize must greater than 0");
        }

        PageQuery pageQuery = new PageQuery();

        pageQuery.page = page;
        pageQuery.pageSize = pageSize;
        pageQuery.params = params;

        return pageQuery;
    }

    /**
     * 索引方式查询数据
     * 根据传入 当前页码、每页数据大小等查询索引当前页面数据
     *
     * @param page          当前页码
     * @param pageSize      当前页数据条数
     * @return
     */
    public static PageQuery buildByIndex(int page, int pageSize) {
        return buildByIndex(page, pageSize, null);
    }


    /**
     * 游标方式查询数据
     * 根据传入 游标、每页数据大小等查询索引当前页面数据
     *
     * @param cursor        游标（上一页：最后一条数据的排序条件）
     * @param pageSize      当前页数据条数
     * @param params        查询参数
     * @return
     */
    public static PageQuery buildByCursor(Object cursor, int pageSize, Map<String, Object> params) {
        if(pageSize <= 0) {
            throw new IllegalArgumentException("the pageSize must greater than 0");
        }

        PageQuery pageQuery = new PageQuery();
        pageQuery.pageSize = pageSize;
        pageQuery.cursor = cursor;
        pageQuery.params = params;
        return pageQuery;
    }

    /**
     * 游标方式查询数据
     * 根据传入 游标、每页数据大小等查询索引当前页面数据
     *
     * @param cursor        游标（上一页：最后一条数据的排序条件）
     * @param pageSize      当前页数据条数
     * @return
     */
    public static PageQuery buildByCursor(Object cursor, int pageSize) {
        return buildByCursor(cursor, pageSize, null);
    }

    public Object getCursor() {
        return cursor;
    }

    public Map<String, Object> getParams() {
        return params;
    }

    public int getOffset() {
        return (page - 1) * pageSize;
    }

    public int getLimit() {
        return pageSize;
    }
}
